package middleware

import (
	"gitee.com/tang_q/gin-vue3-admin-api/global"
	"gitee.com/tang_q/gin-vue3-admin-api/utils"
	"github.com/gin-gonic/gin"
)

// RgAuth 是一个返回 gin.HandlerFunc 类型的函数，用于处理 HTTP 请求的授权验证
func RgAuth() gin.HandlerFunc {
	return func(context *gin.Context) {
		// 验证token
		token := context.GetHeader("Authorization")
		if token == "" {
			context.AbortWithStatusJSON(403, gin.H{"error": "Unauthorized"})
			//context.Abort() 用了AbortWithStatusJSON 就不需要 context.Abort()
			return
		}

		// 验证token是否有效
		cl, err := utils.ParseTokenHs256(token)
		if err != nil {
			context.AbortWithStatusJSON(401, gin.H{"error": "Unauthorized"})
			return
		}
		// 验证token是否在redis中
		exists, err := global.Redis.Exists(context, cl.ID).Result()
		if err != nil {
			context.AbortWithStatusJSON(500, gin.H{"error": err.Error()})
			return
		}
		if exists != 0 {
			context.AbortWithStatusJSON(401, gin.H{"error": "Unauthorized"})
			return
		}
		// 验证是否有API权限
		if !utils.CheckPermission(cl, context.Request.URL.Path, context.Request.Method) {
			context.AbortWithStatusJSON(403, gin.H{"error": "无API权限"})
			return
		}

		// 将用户信息保存到上下文中
		context.Set("loginName", cl.LoginName)

		context.Next()
	}
}
